package com.itheima.d2_reflect;

/**
 * 目标：获取Class对象。
 *
 * 反射:
 * 认识反射  获取类的构造器   获取类的成员变量    获取类的成员方法    作用、应用场景
 * 反射指的是，允许以编程的方式，访问已加载类的成分（成员变量、方法、构造器等）。
 * 反射学什么？：学习如何获取类的信息，然后操作它们
 * 1、反射第一步：
 * 加载类，获取类的字节码文件，也就是Class文件。Java中万物皆对象，字节码文件本身也是一个对象。
 * Java中提供了class类来代表字节码，所以说获取类，指的就是获取class对象，这个class对象会封装这个类的各种信息
 * 2、获取类的构造器：
 * 构造器也会是一个对象，去获取类中的某个构造器，后面会返回一个Constructor对象，这个对象会封装该构造器的信息，
 * 然后就能通过这个对象去拿到该构造器的各种信息，或者对构造器进行操作
 * 3、获取类的成员变量：
 * 拿到Field对象
 * 4、获取类的成员方法：
 * Method对象
 *
 * 反射的关键：
 * 反射的第一步：先加载类，获取类的字节码文件，然后获取类：class对象
 *
 *  源代码阶段   Class类中静态方法 1、forName(String className)
 *  Class对象阶段               2、类名.class
 *  Runtime运行时阶段           3、对象.getClass()
 *
 * 反射的基本作用、关键？
 * 反射是在运行时获取类的字节码文件对象：然后可以解析类中的全部成分。
 * 反射的核心思想和关键就是:得到编译以后的class文件对象。
 *
 * 反射的第一步是什么？
 * 获取Class类对象，如此才可以解析类的全部成分
 * 获取Class类的对象的三种方式
 * 方式一：Class c2 = 类名.class
 * 方式二：Class c1 = Class.forName(“全类名”); 调用Class提供的方法：public static Class forName(String package);
 * 方式三：Class c3 = 对象.getClass(); 调用Object提供的方法：public Class getClass();
 */
public class Test1Class {
    public static void main(String[] args) throws Exception {
        //方式一：Class c2 = 类名.class
        Class c1 = Student.class;
        System.out.println(c1);
        System.out.println(c1.getName()); //com.itheima.d2_reflect.Student，是包名+类名的形式。也就是全类名
        System.out.println(c1.getSimpleName()); //可以拿到简名：Student，就是所谓的类名

        //方式二：Class c1 = Class.forName(“全类名”)
        Class c2 = Class.forName("com.itheima.d2_reflect.Student");
        System.out.println(c1 == c2);

        //方式三：Class c3 = 对象.getClass()
        Student s = new Student();
        Class c3 = s.getClass();
        System.out.println(c3 == c2);
    }
}
